#include <iostream>
#include <functional>
#include <memory>
#include "Log.hpp"
#include "TcpServer.hpp"  // 处理IO的
#include "Calculator.hpp" // 处理业务的

Calculator calculator; // 定义一个计算器对象

// Reactor 模式的核心思想是使用一个事件循环（Event Loop）来处理所有 I/O 事件，
//  并通过多路复用（Multiplexing）技术来同时监控多个文件描述符（如套接字）的状态
void DefaultOnMessage(std::weak_ptr<Connection> conn)
{
    if (conn.expired())
        return;
    auto connection_ptr = conn.lock();
    // 处理保文
    std::cout << "上层得到数据： " << connection_ptr->Inbuffer() << std::endl;
    std::string response_str = calculator.Handler(connection_ptr->Inbuffer());
    if (response_str.empty())
        return;
    lg(Debug, "%s", response_str.c_str());
    // 发送报文response_str
    connection_ptr->AppendOutBuffer(response_str);
    // connection_ptr->_send_cb(connection_ptr); 用connection对象的发送回调函数发送数据
    //_send_cb 方法和 TcpServer::Sender 方法的实现逻辑完全一致，那么从功能上看两种方式是相同的。
    // 但是从设计模式的角度来看，第二种方式更为合理，因为它将发送逻辑集中在一个地方，便于维护和扩展
    auto tcpserver = connection_ptr->_tcp_server_ptr.lock(); // 通过TcpServer对象服务器发送函数发送数据
    tcpserver->Sender(connection_ptr);
}

int main()
{
    std::shared_ptr<TcpServer> epoll_svr(new TcpServer(8888, DefaultOnMessage));
    epoll_svr->Init();
    epoll_svr->Loop();
    return 0;
}